Trabajo Práctico Final: Velocidades de Internet¶

ITBA

Especialización en Ciencia de Datos

Materia: Visualización de la información

Alumnos:

  • Buccari, María Florencia
  • Moretti, Francisco
  • Vignolo, Ayrton
  • Vischi Cortés, Paula

Introducción¶

En este proyecto intentaremos visualizar el estado de la conectividad de internet en países de América Latina y el Caribe, documentar la heterogeneidad y la relación con otras brechas de infraestructura. Para ello, tomamos datos provenientes de OOKLA para 2023, que realizan una recolección de las pruebas de velocidad de los dispositivos y las publican en su portal de forma agregada por trimestre, para grids de 600 metros x 600 metros. Estos datos los enriquecemos con datos de población y de brechas de infraestructura proveniente de los censos poblacionales de cada país.

Librerías¶

In [ ]:
#Instalamos librerías
!pip install altair -U
!pip install vegafusion
!pip install "vegafusion[embed]>=1.5.0"
!pip install vegafusion vegafusion-python-embed
!pip install --upgrade altair
!pip install geopandas pandas
!pip install duckdb
Requirement already satisfied: altair in /usr/local/lib/python3.10/dist-packages (4.2.2)
Collecting altair
  Downloading altair-5.4.1-py3-none-any.whl.metadata (9.4 kB)
Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from altair) (3.1.4)
Requirement already satisfied: jsonschema>=3.0 in /usr/local/lib/python3.10/dist-packages (from altair) (4.23.0)
Collecting narwhals>=1.5.2 (from altair)
  Downloading narwhals-1.12.1-py3-none-any.whl.metadata (7.2 kB)
Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from altair) (24.1)
Requirement already satisfied: typing-extensions>=4.10.0 in /usr/local/lib/python3.10/dist-packages (from altair) (4.12.2)
Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (24.2.0)
Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (2024.10.1)
Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (0.35.1)
Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (0.20.0)
Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->altair) (3.0.2)
Downloading altair-5.4.1-py3-none-any.whl (658 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 658.1/658.1 kB 8.2 MB/s eta 0:00:00
Downloading narwhals-1.12.1-py3-none-any.whl (195 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 195.1/195.1 kB 8.8 MB/s eta 0:00:00
Installing collected packages: narwhals, altair
  Attempting uninstall: altair
    Found existing installation: altair 4.2.2
    Uninstalling altair-4.2.2:
      Successfully uninstalled altair-4.2.2
Successfully installed altair-5.4.1 narwhals-1.12.1
Collecting vegafusion
  Downloading vegafusion-1.6.9-py3-none-any.whl.metadata (1.3 kB)
Requirement already satisfied: altair>=5.2.0 in /usr/local/lib/python3.10/dist-packages (from vegafusion) (5.4.1)
Requirement already satisfied: pyarrow>=5 in /usr/local/lib/python3.10/dist-packages (from vegafusion) (16.1.0)
Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from vegafusion) (2.2.2)
Requirement already satisfied: psutil in /usr/local/lib/python3.10/dist-packages (from vegafusion) (5.9.5)
Requirement already satisfied: protobuf in /usr/local/lib/python3.10/dist-packages (from vegafusion) (3.20.3)
Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion) (3.1.4)
Requirement already satisfied: jsonschema>=3.0 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion) (4.23.0)
Requirement already satisfied: narwhals>=1.5.2 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion) (1.12.1)
Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion) (24.1)
Requirement already satisfied: typing-extensions>=4.10.0 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion) (4.12.2)
Requirement already satisfied: numpy>=1.16.6 in /usr/local/lib/python3.10/dist-packages (from pyarrow>=5->vegafusion) (1.26.4)
Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion) (2024.2)
Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion) (2024.2)
Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion) (24.2.0)
Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion) (2024.10.1)
Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion) (0.35.1)
Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion) (0.20.0)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas->vegafusion) (1.16.0)
Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->altair>=5.2.0->vegafusion) (3.0.2)
Downloading vegafusion-1.6.9-py3-none-any.whl (54 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 54.5/54.5 kB 1.9 MB/s eta 0:00:00
Installing collected packages: vegafusion
Successfully installed vegafusion-1.6.9
Requirement already satisfied: vegafusion>=1.5.0 in /usr/local/lib/python3.10/dist-packages (from vegafusion[embed]>=1.5.0) (1.6.9)
Requirement already satisfied: altair>=5.2.0 in /usr/local/lib/python3.10/dist-packages (from vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (5.4.1)
Requirement already satisfied: pyarrow>=5 in /usr/local/lib/python3.10/dist-packages (from vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (16.1.0)
Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (2.2.2)
Requirement already satisfied: psutil in /usr/local/lib/python3.10/dist-packages (from vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (5.9.5)
Requirement already satisfied: protobuf in /usr/local/lib/python3.10/dist-packages (from vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (3.20.3)
Collecting vegafusion-python-embed==1.6.9 (from vegafusion[embed]>=1.5.0)
  Downloading vegafusion_python_embed-1.6.9-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (394 bytes)
Collecting vl-convert-python>=0.7.0 (from vegafusion[embed]>=1.5.0)
  Downloading vl_convert_python-1.7.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.2 kB)
Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (3.1.4)
Requirement already satisfied: jsonschema>=3.0 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (4.23.0)
Requirement already satisfied: narwhals>=1.5.2 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (1.12.1)
Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (24.1)
Requirement already satisfied: typing-extensions>=4.10.0 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (4.12.2)
Requirement already satisfied: numpy>=1.16.6 in /usr/local/lib/python3.10/dist-packages (from pyarrow>=5->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (1.26.4)
Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (2024.2)
Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (2024.2)
Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (24.2.0)
Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (2024.10.1)
Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (0.35.1)
Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (0.20.0)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (1.16.0)
Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->altair>=5.2.0->vegafusion>=1.5.0->vegafusion[embed]>=1.5.0) (3.0.2)
Downloading vegafusion_python_embed-1.6.9-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (25.1 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 25.1/25.1 MB 47.2 MB/s eta 0:00:00
Downloading vl_convert_python-1.7.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30.1 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 30.1/30.1 MB 19.8 MB/s eta 0:00:00
Installing collected packages: vegafusion-python-embed, vl-convert-python
Successfully installed vegafusion-python-embed-1.6.9 vl-convert-python-1.7.0
Requirement already satisfied: vegafusion in /usr/local/lib/python3.10/dist-packages (1.6.9)
Requirement already satisfied: vegafusion-python-embed in /usr/local/lib/python3.10/dist-packages (1.6.9)
Requirement already satisfied: altair>=5.2.0 in /usr/local/lib/python3.10/dist-packages (from vegafusion) (5.4.1)
Requirement already satisfied: pyarrow>=5 in /usr/local/lib/python3.10/dist-packages (from vegafusion) (16.1.0)
Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from vegafusion) (2.2.2)
Requirement already satisfied: psutil in /usr/local/lib/python3.10/dist-packages (from vegafusion) (5.9.5)
Requirement already satisfied: protobuf in /usr/local/lib/python3.10/dist-packages (from vegafusion) (3.20.3)
Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion) (3.1.4)
Requirement already satisfied: jsonschema>=3.0 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion) (4.23.0)
Requirement already satisfied: narwhals>=1.5.2 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion) (1.12.1)
Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion) (24.1)
Requirement already satisfied: typing-extensions>=4.10.0 in /usr/local/lib/python3.10/dist-packages (from altair>=5.2.0->vegafusion) (4.12.2)
Requirement already satisfied: numpy>=1.16.6 in /usr/local/lib/python3.10/dist-packages (from pyarrow>=5->vegafusion) (1.26.4)
Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion) (2024.2)
Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion) (2024.2)
Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion) (24.2.0)
Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion) (2024.10.1)
Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion) (0.35.1)
Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair>=5.2.0->vegafusion) (0.20.0)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas->vegafusion) (1.16.0)
Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->altair>=5.2.0->vegafusion) (3.0.2)
Requirement already satisfied: altair in /usr/local/lib/python3.10/dist-packages (5.4.1)
Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from altair) (3.1.4)
Requirement already satisfied: jsonschema>=3.0 in /usr/local/lib/python3.10/dist-packages (from altair) (4.23.0)
Requirement already satisfied: narwhals>=1.5.2 in /usr/local/lib/python3.10/dist-packages (from altair) (1.12.1)
Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from altair) (24.1)
Requirement already satisfied: typing-extensions>=4.10.0 in /usr/local/lib/python3.10/dist-packages (from altair) (4.12.2)
Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (24.2.0)
Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (2024.10.1)
Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (0.35.1)
Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (0.20.0)
Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->altair) (3.0.2)
Requirement already satisfied: geopandas in /usr/local/lib/python3.10/dist-packages (1.0.1)
Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (2.2.2)
Requirement already satisfied: numpy>=1.22 in /usr/local/lib/python3.10/dist-packages (from geopandas) (1.26.4)
Requirement already satisfied: pyogrio>=0.7.2 in /usr/local/lib/python3.10/dist-packages (from geopandas) (0.10.0)
Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from geopandas) (24.1)
Requirement already satisfied: pyproj>=3.3.0 in /usr/local/lib/python3.10/dist-packages (from geopandas) (3.7.0)
Requirement already satisfied: shapely>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from geopandas) (2.0.6)
Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas) (2024.2)
Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.10/dist-packages (from pandas) (2024.2)
Requirement already satisfied: certifi in /usr/local/lib/python3.10/dist-packages (from pyogrio>=0.7.2->geopandas) (2024.8.30)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas) (1.16.0)
Requirement already satisfied: duckdb in /usr/local/lib/python3.10/dist-packages (1.1.2)
In [ ]:
!pip install --upgrade altair vegafusion vegafusion-python-embed
Requirement already satisfied: altair in /usr/local/lib/python3.10/dist-packages (5.4.1)
Requirement already satisfied: vegafusion in /usr/local/lib/python3.10/dist-packages (1.6.9)
Requirement already satisfied: vegafusion-python-embed in /usr/local/lib/python3.10/dist-packages (1.6.9)
Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from altair) (3.1.4)
Requirement already satisfied: jsonschema>=3.0 in /usr/local/lib/python3.10/dist-packages (from altair) (4.23.0)
Requirement already satisfied: narwhals>=1.5.2 in /usr/local/lib/python3.10/dist-packages (from altair) (1.12.1)
Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from altair) (24.1)
Requirement already satisfied: typing-extensions>=4.10.0 in /usr/local/lib/python3.10/dist-packages (from altair) (4.12.2)
Requirement already satisfied: pyarrow>=5 in /usr/local/lib/python3.10/dist-packages (from vegafusion) (16.1.0)
Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (from vegafusion) (2.2.2)
Requirement already satisfied: psutil in /usr/local/lib/python3.10/dist-packages (from vegafusion) (5.9.5)
Requirement already satisfied: protobuf in /usr/local/lib/python3.10/dist-packages (from vegafusion) (3.20.3)
Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (24.2.0)
Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (2024.10.1)
Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (0.35.1)
Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair) (0.20.0)
Requirement already satisfied: numpy>=1.16.6 in /usr/local/lib/python3.10/dist-packages (from pyarrow>=5->vegafusion) (1.26.4)
Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->altair) (3.0.2)
Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion) (2024.2)
Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.10/dist-packages (from pandas->vegafusion) (2024.2)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas->vegafusion) (1.16.0)
In [ ]:
#Importamos las librerías
import pandas as pd
import altair as alt
import geopandas as gpd
alt.data_transformers.enable("vegafusion")
import warnings
import duckdb
warnings.simplefilter(action='ignore', category=FutureWarning)
import numpy as np

Paleta de colores¶

In [ ]:
#Creamos una paleta de colores que ciertos gráficos nos permita distinguir de mejor manera nuestras observaciones
palette = [
    "#EAB8B1",  # Pastel Red
    "#F6D7A9",  # Pastel Orange
    "#E3F6A1",  # Pastel Yellow
    "#B9E6B3",  # Pastel Green
    "#A4D7E1",  # Pastel Cyan
    "#B2C2E6",  # Pastel Blue
    "#C7A2E2",  # Pastel Lavender
    "#E2A8D2",  # Pastel Magenta
    "#F8BBD0",  # Pastel Pink
    "#FF9C85",  # Light Coral
    "#FFCCB3",  # Light Peach
    "#D5E3A0",  # Light Lime
    "#9ED1B0",  # Light Mint
    "#7DA1D5",  # Light Sky Blue
    "#A59FD5",  # Light Purple
    "#D6B9D9",  # Light Orchid
    "#F5CBA0",  # Light Apricot
    "#C7D3D4",  # Light Gray
    "#F9F6C1",  # Light Cream
    "#FFB5E8",  # Light Blush
    "#FF6B6B",  # Bright Red
    "#FFD700",  # Bright Yellow
    "#3DDC84",  # Bright Green
    "#5A9BD5",  # Bright Blue
    "#B05EB4",  # Bright Purple
    "#FF85A2",  # Bright Pink
    "#A7A8D9"   # Soft Indigo
]

1. Levantamos el conjunto de datos para empezar a trabajar¶

Sobre el conjunto de datos utilizado:

Como se mencionó en la introducción, en este trabajo utilizamos la base de datos pública de OOKLA para 2023, de donde tomamos los datos sobre velocidad de internet fijo. Estos datos los enriquecemos con datos de población proveniente de los censos poblacionales de cada país y de brechas de infraestructura.

Para documentar la heterogeneidad, aprovechamos la desagregación geográfica de los datos de los censos y tomamos los gobiernos locales (municipios/comunas) como unidad de análisis geográfico (a excepción de Argentina y Uruguay). Para que coincidan las unidades geográficas de análisis, los datos de OOKLA son agregados a nivel de gobierno local, haciendo la intersección de las capas geográficas. El detalle del procesamiento se puede ver en este link o un ejemplo más breve en colab se puede consultar aquí (en esta prueba es probable que arroje el error "sin memoria RAM", por lo que se recomienda correrlo localmente).

In [ ]:
#Levantamos el dataset
df = pd.read_csv("https://paulavischic.github.io/ecd2024a/data/ookla_porlevel_2023.csv")

2. Análisis Exploratorio de Datos (EDA)¶

Las variables que utilizaremos son las siguientes:

Variables que identifican la unidad geográfica:

  • COUNTRY: Nombre del país de América Latina y el Caribe
  • NAME_1: Nombre del subnacional de nivel 1 (corresponde a Estados/Provincias)
  • NAME_2: Nombre del subnacional de nivel 2 (corresponde a Municipios/Gobiernos locales)

Variables de conectividad de internet:

  • speed_df1: Velocidad de descarga promedio anual 2023 medido en Megabits por segundo (Mbps). No considera los grids en los que hubo un solo dispositivo que realizó el test.
  • speed_uf1: Velocidad de carga/subida promedio anual 2023 medido en Megabits por segundo (Mbps). No considera los grids en los que hubo un solo dispositivo que realizó el test.

Variables que caracterizan la unidad geográfica:

  • población: Población censada en la unidad geográfica.
  • tics_internet: % de hogares con acceso a internet.
  • agua_mejorada_red: % de hogares que se abastecen de agua a través de la red.
  • electricidad: % de hogares con acceso a electricidad.
In [ ]:
#Hacemos una primera visualización de nuestros datos
keep=['COUNTRY', 'NAME_1', 'NAME_2', 'speed_df1', 'speed_uf1', 'poblacion', 'tics_internet', 'agua_mejorada_red', 'electricidad' ]
df=df[keep]
df.head()
Out[ ]:
COUNTRY NAME_1 NAME_2 speed_df1 speed_uf1 poblacion tics_internet agua_mejorada_red electricidad
0 Argentina Buenos Aires NaN 103.450934 54.207011 15634050.0 NaN 0.756510 0.997917
1 Argentina Catamarca NaN 58.539385 31.985785 367556.0 NaN 0.935111 0.976998
2 Argentina Chaco NaN 52.419413 27.133152 1055337.0 NaN 0.763009 0.939295
3 Argentina Chubut NaN 51.833834 44.693544 509194.0 NaN 0.963976 0.990512
4 Argentina Ciudad de Buenos Aires NaN 150.602219 59.033449 2892544.0 NaN 0.997258 0.999503
In [ ]:
#Obtenemos cuántas variables y registros tiene nuestro set de datos
df.shape
Out[ ]:
(12428, 9)
In [ ]:
#Un primer acercamiento a las medidas descriptivas de cada variable
df.describe()
Out[ ]:
speed_df1 speed_uf1 poblacion tics_internet agua_mejorada_red electricidad
count 11707.000000 11707.000000 1.222800e+04 11698.000000 11943.000000 11880.000000
mean 74.211919 53.969532 4.714948e+04 0.178589 0.710452 0.940924
std 56.802383 48.017819 2.481386e+05 0.166036 0.214059 0.119449
min 0.157000 0.160667 8.100000e+01 0.000000 0.000000 0.025758
25% 27.579885 13.668083 6.043750e+03 0.048774 0.585740 0.952153
50% 60.247463 38.751340 1.375850e+04 0.125928 0.757095 0.985702
75% 109.835778 84.878647 3.171100e+04 0.263659 0.880055 0.995532
max 482.627000 322.413937 1.563405e+07 0.936680 1.000000 1.000000
In [ ]:
#Obtenemos un nuevo resumen con cantidades, nulos y tipo de datos
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 12428 entries, 0 to 12427
Data columns (total 9 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   COUNTRY            12428 non-null  object 
 1   NAME_1             12153 non-null  object 
 2   NAME_2             12385 non-null  object 
 3   speed_df1          11707 non-null  float64
 4   speed_uf1          11707 non-null  float64
 5   poblacion          12228 non-null  float64
 6   tics_internet      11698 non-null  float64
 7   agua_mejorada_red  11943 non-null  float64
 8   electricidad       11880 non-null  float64
dtypes: float64(6), object(3)
memory usage: 874.0+ KB
In [ ]:
#Visualizamos qué países tenemos
df['COUNTRY'].unique()
Out[ ]:
array(['Argentina', 'Uruguay', 'Mexico', 'República Dominicana',
       'Bahamas', 'Chile', 'Colombia', 'Ecuador', 'Guatemala',
       'Nicaragua', 'Antigua and Barbuda', 'Jamaica', 'Suriname',
       'Trinidad and Tobago', 'Brazil', 'Costa Rica', 'Cuba', 'Honduras',
       'Venezuela', 'Bolivia', 'Panama', 'Paraguay', 'Haiti', 'Peru',
       'Saint Kitts and Nevis', 'El Salvador'], dtype=object)
In [ ]:
#Como así también a nivel Estado/Provincia
df['NAME_1'].unique()
Out[ ]:
array(['Buenos Aires', 'Catamarca', 'Chaco', 'Chubut',
       'Ciudad de Buenos Aires', 'Córdoba', 'Corrientes', 'Entre Ríos',
       'Formosa', 'Jujuy', 'La Pampa', 'La Rioja', 'Mendoza', 'Misiones',
       'Neuquén', 'Río Negro', 'Salta', 'San Juan', 'San Luis',
       'Santa Cruz', 'Santa Fe', 'Santiago del Estero',
       'Tierra del Fuego', 'Tucumán', 'Artigas', 'Canelones',
       'Cerro Largo', 'Colonia', 'Durazno', 'Flores', 'Florida',
       'Lavalleja', 'Maldonado', 'Montevideo', 'Paysandú', 'Rivera',
       'Rocha', 'Salto', 'San José', 'Soriano', 'Tacuarembó',
       'Treinta y Tres', 'Guerrero', nan, 'Región de Tarapacá',
       'Región de Antofagasta', 'Región de Atacama', 'Región de Coquimbo',
       'Región de Valparaíso', 'Región del Libertador Bernardo O',
       'Región del Maule', 'Región del Bío-Bío', 'Región de La Araucanía',
       'Región de Los Lagos', 'Región de Aysén del Gral. Ibañez',
       'Región de Magallanes y Antártica',
       'Región Metropolitana de Santiago', 'Región de Los Ríos',
       'Región de Arica y Parinacota', 'Región de Ñuble', 'Antioquia',
       'Norte de Santander', 'Meta', 'Chocó', 'Huila', 'Bolívar',
       'Cundinamarca', 'Cesar', 'Santander', 'Caldas', 'Casanare',
       'Nariño', 'Caquetá', 'La Guajira', 'Valle del Cauca', 'Magdalena',
       'Cauca', 'Boyacá', 'Tolima', 'Risaralda', 'Arauca', 'Quindio',
       'Atlántico', 'Guainía', 'Bogotá, D.C.', 'Sucre', 'Guaviare',
       'Vaupés', 'Putumayo', 'Vichada', 'Amazonas',
       'Archipiélago de San Andrés, Prov', 'Manabi', 'Orellana',
       'Chimborazo', 'Guayas', 'Tungurahua', 'Imbabura', 'Pastaza',
       'Napo', 'El Oro', 'Esmeraldas', 'Cañar', 'Los Rios', 'Carchi',
       'Bolivar', 'Loja', 'Azuay', 'Sucumbios', 'Pichincha',
       'Zamora Chinchipe', 'Zona No Delimitada', 'Morona Santiago',
       'Galapagos', 'Santa Elena', 'Cotopaxi',
       'Santo Domingo de los Tsachilas', 'Chimaltenango', 'Jutiapa',
       'Huehuetenango', 'Quetzaltenango', 'Sacatepéquez', 'Guatemala',
       'San Marcos', 'Santa Rosa', 'Zacapa', 'Alta Verapaz', 'Chiquimula',
       'Quiché', 'Retalhuleu', 'Suchitepéquez', 'Sololá', 'Baja Verapaz',
       'Petén', 'Izabal', 'El Progreso', 'Escuintla', 'Jalapa',
       'Totonicapán', 'Aguascalientes', 'Baja California',
       'Baja California Sur', 'Campeche', 'Coahuila de Zaragoza',
       'Colima', 'Chiapas', 'Chihuahua', 'Ciudad de México', 'Durango',
       'Guanajuato', 'Hidalgo', 'Jalisco', 'México',
       'Michoacán de Ocampo', 'Morelos', 'Nayarit', 'Nuevo León',
       'Oaxaca', 'Puebla', 'Querétaro', 'Quintana Roo',
       'San Luis PotosÃ\xad', 'Sinaloa', 'Sonora', 'Tabasco',
       'Tamaulipas', 'Tlaxcala', 'Veracruz de Ignacio de la Llave',
       'Yucatán', 'Zacatecas', 'Managua', 'León', 'Rivas',
       'Región Autónoma Costa Caribe Nor', 'Matagalpa', 'Chinandega',
       'Carazo', 'Nueva Segovia', 'Río San Juan', 'Madriz', 'Granada',
       'Región Autónoma de la Costa Cari', 'Jinotega', 'Masaya', 'Boaco',
       'Chontales', 'Estelí', 'Acre', 'Alagoas', 'Amapá', 'Bahia',
       'Ceará', 'Espírito Santo', 'Goiás', 'Maranhão', 'Mato Grosso',
       'Mato Grosso do Sul', 'Minas Gerais', 'Pará', 'Paraíba', 'Paraná',
       'Pernambuco', 'Piauí', 'Rio de Janeiro', 'Rio Grande do Norte',
       'Rio Grande do Sul', 'Rondônia', 'Roraima', 'Santa Catarina',
       'São Paulo', 'Sergipe', 'Tocantins', 'Alajuela', 'Cartago',
       'Guanacaste', 'Heredia', 'Limón', 'Puntarenas', 'Camagüey',
       'Ciego de Ávila', 'Cienfuegos', 'Ciudad de la Habana', 'Granma',
       'Guantánamo', 'Holguín', 'Isla de la Juventud', 'La Habana',
       'Las Tunas', 'Matanzas', 'Mayabeque', 'Pinar del Río',
       'Sancti Spíritus', 'Santiago de Cuba', 'Villa Clara', 'Atlántida',
       'Choluteca', 'Colón', 'Comayagua', 'Copán', 'Cortés', 'El Paraíso',
       'Francisco Morazán', 'Gracias a Dios', 'Intibucá',
       'Islas de la Bahía', 'La Paz', 'Lempira', 'Ocotepeque', 'Olancho',
       'Santa Bárbara', 'Valle', 'Yoro', 'Anzoátegui', 'Apure', 'Aragua',
       'Barinas', 'Carabobo', 'Cojedes', 'Delta Amacuro',
       'Distrito Capital', 'Falcón', 'Guárico', 'Lara', 'Mérida',
       'Miranda', 'Monagas', 'Nueva Esparta', 'Portuguesa', 'Táchira',
       'Trujillo', 'Vargas', 'Yaracuy', 'Zulia', 'Beni', 'Chuquisaca',
       'Cochabamba', 'Oruro', 'Pando', 'Potosí', 'Tarija', 'Panamá Oeste',
       'Veraguas', 'Panamá', 'Los Santos', 'Darién', 'Chiriquí', 'Coclé',
       'Bocas del Toro', 'Herrera', 'Comarca Ngäbe Buglé',
       'Comarca Emberá Wounaán', 'ITAPUA', 'SAN PEDRO', 'CAAGUAZU',
       'CANINDEYU', 'CORDILLERA', 'GUAIRA', 'BOQUERON', 'AMAMBAY',
       'PARAGUARI', 'ALTO PARANA', 'PRESIDENTE HAYES', 'CAAZAPA',
       'MISIONES', 'CENTRAL', 'ALTO PARAGUAY', 'CONCEPCION', 'ÑEEMBUCU',
       'ASUNCION', "Grande'Anse", 'Nord', 'Nord-Ouest', 'Sud-Est',
       'Nippes', 'Ouest', 'Artibonite', 'Sud', 'Centre', 'Nord-Est',
       'Apurimac', 'Huancavelica', 'Cusco', 'Ancash', 'Loreto', 'Huanuco',
       'Arequipa', 'La Libertad', 'Ucayali', 'Piura', 'Puno', 'Lima',
       'San Martin', 'Cajamarca', 'Callao', 'Tacna', 'Ayacucho', 'Junin',
       'Lambayeque', 'Ica', 'Tumbes', 'Pasco', 'Moquegua',
       'Madre de Dios'], dtype=object)
In [ ]:
# Histograma de la variable velocidad de descarga
alt.Chart(df).mark_bar(color='#fdb462').encode(
    alt.X("speed_df1:Q", bin= True, title = 'Velocidad de descarga (Mbps)'),
    alt.Y('count()', title = 'Total')
).properties(
    title='Histograma de velocidad de descarga',
)
Out[ ]:

El histograma muestra que la mayoría de las conexiones de internet en América Latina y el Caribe tienen velocidades de descarga bajas, concentradas principalmente entre 0 y 50 Mbps. A medida que las velocidades aumentan, la frecuencia de observaciones disminuye drásticamente, y apenas se registran datos a partir de los 250 Mbps. Esto sugiere que la mayoría de los usuarios en la región experimentan bajas velocidades, con pocos casos de acceso a internet de alta velocidad, reflejando una posible desigualdad en la calidad del servicio de internet en la región.

In [ ]:
# Graficamos un histograma de velocidad de carga
alt.Chart(df).mark_bar(color='#bc80bd').encode(
    alt.X("speed_uf1:Q", bin= True, title = 'Velocidad de carga (Mbps)'),
    alt.Y('count()', title = 'Total')
).properties(
    title='Histograma de velocidad de carga',
)
Out[ ]:

El histograma de velocidad de carga en América Latina y el Caribe muestra una concentración significativa en las velocidades bajas, con la mayoría de las observaciones entre 0 y 50 Mbps. A medida que las velocidades de carga aumentan, la frecuencia disminuye rápidamente, y las velocidades superiores a 150 Mbps son muy poco comunes. Esto refleja que la mayoría de los usuarios en la región tienen conexiones con capacidades limitadas de carga, lo que puede impactar negativamente la calidad de las aplicaciones que dependen de una alta velocidad de subida.

In [ ]:
# Boxplot de velocidad de descargar
alt.Chart(df).mark_boxplot(color='#fdb462').encode(
    x=alt.X('speed_df1:Q', title='Velocidad de descarga (Mbps)'),
    tooltip=['speed_df1:Q']
).properties(
    title='Boxplot de velocidad de descarga'
)
Out[ ]:

Se observa que la mediana se ubica alrededor de los 55 Mbps, con mínimos y máximos entre 0 y 225 Mbps aproximadamente. Asimismo, el 50% de los datos se encuentran entre 25 y 105 Mbps aproximadamente. Por último, se visualizan gran cantidad de outliers, destacándose dos casos por encima de los 350 Mbps.

In [ ]:
# Boxplot de velocidad de carga
alt.Chart(df).mark_boxplot(color='#bc80bd').encode(
    x=alt.X('speed_uf1:Q', title='Velocidad de carga (Mbps)'),
    tooltip=['speed_uf1:Q']
).properties(
    title='Boxplot de velocidad de carga'
)
Out[ ]:

Se comprueba que la velocidad de carga en todas sus medidas es menor a la de descarga. Se observa que la mediana se ubica alrededor de los 40 Mbps, con mínimos y máximos entre 0 y 180 Mbps aproximadamente. Asimismo, el 50% de los datos se encuentran entre 20 y 80 Mbps aproximadamente. Por último, se visualizan gran cantidad de outliers, destacándose tres casos por encima de los 270 Mbps.

In [ ]:
#Creamos un tabla resumen de la velocidad mediana por país
df_mediana = df.groupby('COUNTRY')[['speed_df1', 'speed_uf1']].median().reset_index()
df_mediana = df_mediana.rename(columns={'speed_df1': 'Velocidad de descarga (Mbps)', 'speed_uf1': 'Velocidad de carga (Mbps)'})
df_mediana
Out[ ]:
COUNTRY Velocidad de descarga (Mbps) Velocidad de carga (Mbps)
0 Antigua and Barbuda 28.398862 11.317931
1 Argentina 56.878448 31.845309
2 Bahamas 69.056249 17.747000
3 Bolivia 19.276464 12.128492
4 Brazil 102.745613 80.675300
5 Chile 228.860600 187.343333
6 Colombia 23.234396 16.489475
7 Costa Rica 68.336215 46.408289
8 Cuba 2.308000 1.256217
9 Ecuador 56.957475 56.445784
10 El Salvador 33.012580 9.460210
11 Guatemala 25.509683 9.931094
12 Haiti 38.515536 13.303209
13 Honduras 24.246500 14.746000
14 Jamaica 62.058600 43.066160
15 Mexico 29.598111 11.924144
16 Nicaragua 38.700523 16.868031
17 Panama 126.783778 48.058406
18 Paraguay 39.478333 25.349867
19 Peru 49.211497 33.341607
20 República Dominicana 24.214570 8.415603
21 Saint Kitts and Nevis 52.373773 35.167820
22 Suriname 16.304518 8.468032
23 Trinidad and Tobago 134.298791 96.694042
24 Uruguay 164.202952 37.172521
25 Venezuela 23.105571 17.234133
In [ ]:
#Graficamos la velocidad mediana de descarga por país obtenida en la tabla anterior
df_sorted = df_mediana.sort_values(by='Velocidad de descarga (Mbps)')
bar=alt.Chart(df_sorted).mark_bar(color='#fdb462').encode(
    x=alt.X('Velocidad de descarga (Mbps)',sort ='-x'),
    y=alt.Y('COUNTRY', title='País'),
    tooltip=[
       alt.Tooltip('Velocidad de descarga (Mbps)', title='Velocidad de descarga (Mbps)', format='.0f')
    ]
).properties(
    title="Velocidad de descarga mediana por país en 2023 (Mbps)" )
bar
Out[ ]:

Los países con las velocidades más altas son Uruguay y Chile, con medianas superiores a 150 Mbps, lo que refleja un acceso más desarrollado a conexiones de alta velocidad. En contraste, otros países como Cuba, Suriname, Colombia, Venezuela y Bolivia presentan velocidades considerablemente más bajas, por debajo de los 50 Mbps en promedio. Esto sugiere una disparidad significativa en la infraestructura de internet en la región, con algunos países logrando mejores resultados en la calidad de sus redes, mientras que otros se mantienen rezagados.

In [ ]:
#Graficamos la velocidad mediana de carga por país obtenida en la tabla anterior
df_sorted = df_mediana.sort_values(by='Velocidad de carga (Mbps)')
bar=alt.Chart(df_sorted).mark_bar(color='#bc80bd').encode(
    x=alt.X('Velocidad de carga (Mbps)',sort='-x'),
    y=alt.Y('COUNTRY', title='País'),
    tooltip=[
       alt.Tooltip('Velocidad de carga (Mbps)', title='Velocidad de carga (Mbps)', format='.0f')
    ]
).properties(
    title="Velocidad de carga mediana por país en 2023 (Mbps)" )
bar
Out[ ]:

El país con la velocidad de carga más alta por amplio margen es Chile, con medianas superiores a 180 Mbps. A diferencia del gráfico anterior, Uruguay retrocedió algunas posiciones, evidenciando una marcada diferencia entre sus velocidades promedio. En contraposición, nuevamente Cuba y Bolivia presentan las velocidades más bajas, como así también Suriname y Rep. Dominicana, encontrándose por debajo de los 20 Mbps en promedio. Nuevamente, esto expone una disparidad significativa en la infraestructura de internet en la región.

In [ ]:
#Realizamos Box-plot para ambas velocidades, lo cual también nos permite visualizar máximos/mínimos/rangos intercuartílicos
box1= alt.Chart(df).mark_boxplot(color='#fdb462').encode(
    x=alt.X('speed_df1:Q', title='Velocidad de descarga (Mbps)'),
    y=alt.Y('COUNTRY:N', title = None),
    tooltip=['speed_df1:Q']
)
box2= alt.Chart(df).mark_boxplot(color='#bc80bd').encode(
    x=alt.X('speed_uf1:Q', title='Velocidad de carga (Mbps)'),
    y=alt.Y('COUNTRY:N', title = None),
    tooltip=['speed_uf1:Q']
)
box= alt.hconcat(box1, box2).properties(
    title=alt.TitleParams(
        text='Comparación de Velocidades de Descarga y Carga por País',
        anchor='middle',
        fontSize=16
    )
)
box
Out[ ]:

Si bien en el gráfico se expone a América Latina y el Caribe, si focalizamos el análisis en los países de Sudamérica, como se observó en los gráficos precedentes, Chile destaca significativamente con las velocidades más altas tanto en descarga como en carga, seguido por Brasil que muestra una dispersión considerable en ambas métricas con valores medianos también altos. En contraste, Bolivia, Venezuela y Colombia presentan las velocidades más bajas de la región, con medianas por debajo de los 50 Mbps en ambas métricas. Llama la atención en algunos casos la amplia variabilidad en las velocidades de carga y descarga, evidenciado en amplios rangos intercuartílicos, lo que sugiere disparidades importantes en la calidad de la conectividad por ejemplo en Perú, Chile, Brasil y Paraguay. De forma general, se aprecia una marcada heterogeneidad en el desempeño de las redes de internet entre los países de la región.

In [ ]:
# Boxplot de % de hogares con acceso a internet
alt.Chart(df).mark_boxplot(color='#66c2a5').encode(
    x=alt.X('tics_internet:Q', title='% de hogares con acceso a internet'),
    tooltip=['tics_internet:Q']
).properties(
    title='Boxplot de % de hogares con acceso a internet'
)
Out[ ]:

Se observa que la mediana se ubica alrededor del 12%, con mínimos y máximos entre 0% y 57% aproximadamente. Asimismo, el 50% de los datos se encuentran entre 5% y 25% aproximadamente.

In [ ]:
# Boxplot de % de hogares con acceso a internet con apertura por país
alt.Chart(df).mark_boxplot(color='#66c2a5').encode(
    x=alt.X('tics_internet:Q', title='% de hogares con acceso a internet'),
    y=alt.Y('COUNTRY:N', title = None),
    tooltip=['tics_internet:Q']
).properties(
    title='Boxplot de % de hogares con acceso a internet por país'
)
Out[ ]:

El gráfico muestra una amplia variación en el porcentaje de hogares con acceso a internet entre los diferentes países. Se destaca el bajo nivel de acceso en Bolivia, El Salvador y Nicaragua, en contraposición de Jamaica, Panamá, Ecuador y Paraguay que poseen medianas mucho más elevadas. No obstante ello, estos últimos dos países poseen rangos intercuartílicos considerablemente amplios, lo cual evidencia una gran heterogeneidad en el acceso a internet según región. Por otra parte, Uruguay presenta gran homogeneidad en sus observaciones, ya que los datos se encuentran en un rango comprimido.

In [ ]:
# Boxplot de población (nivel municipo)
alt.Chart(df).mark_boxplot(color='#8da0cb').encode(
    x=alt.X('poblacion:Q', title='Población'),
    tooltip=['poblacion:Q']
).properties(
    title='Boxplot de población'
)
Out[ ]:
In [ ]:
df['poblacion'].median()
Out[ ]:
13758.5

El gráfico no es fácil de apreciar dada su gran disparidad entre la población de los municipios, por eso se procedió a calcular la mediana, la cual se ubica en 13.758.

In [ ]:
# Boxplot de población con apertura por país
alt.Chart(df).mark_boxplot(color='#bc80bd').encode(
    x=alt.X('poblacion:Q', title='Población'),
    y=alt.Y('COUNTRY:N', title = None),
tooltip=[
        alt.Tooltip('NAME_1', title='Estado/Provincia'),
        alt.Tooltip('poblacion', title='Población', format=',.0f')
    ]
).properties(
    title='Boxplot de población'
)
Out[ ]:

Existe una gran variabilidad para este campo, lo cual dificulta el resto del análisis y dónde se destacan como outliers los registros pertenecientes a las grandes urbes: Buenos Aires, San Pablo, Río de Janeiro, Bogotá y Lima.

3. Mapa geográfico de la mediana de velocidades de descarga¶

ACA IRÍA EL MAPITA SI LOGRAMOS HACERLO

¿Cuál es el país y ciudad con la mayor velocidad?

In [ ]:
duckdb.sql("select COUNTRY as Country, NAME_1 as Estado, NAME_2 as Ciudad, speed_df1 as Velocidad from df order by speed_df1 desc limit 1").df()
Out[ ]:
Country Estado Ciudad Velocidad
0 Brazil Rio Grande do Sul Itatiba do Sul 482.627

¿Y dentro de Argentina?

In [ ]:
duckdb.sql("select COUNTRY as Country, NAME_1 as Ciudad, speed_df1 as Velocidad from df where COUNTRY = 'Argentina' order by speed_df1 desc limit 1").df()
Out[ ]:
Country Ciudad Velocidad
0 Argentina Ciudad de Buenos Aires 150.602219

¿Cuál es el país y ciudad con la menor velocidad?

In [ ]:
duckdb.sql("select COUNTRY as Country, NAME_1 as Estado, NAME_2 as Ciudad, speed_df1 as Velocidad from df order by speed_df1 asc limit 1").df()
Out[ ]:
Country Estado Ciudad Velocidad
0 Brazil Rio Grande do Sul São José das Missões 0.157

En Argentina ...

In [ ]:
duckdb.sql("select COUNTRY as Country, NAME_1 as Provincia,  speed_df1 as Velocidad from df where COUNTRY = 'Argentina' order by speed_df1 asc limit 1").df()
Out[ ]:
Country Provincia Velocidad
0 Argentina Tierra del Fuego 18.084988

Dentro de Argentina, ¿cuáles son las provincias con una velocidad mayor al promedio del país?

In [ ]:
query = duckdb.sql("""
with m as (
select COUNTRY as country, avg(speed_df1) AS avg_velocidad_descarga
from df
group by COUNTRY)

select df.COUNTRY as country, NAME_1 as estado, NAME_2 as ciudad, speed_df1, avg_velocidad_descarga
from df inner join m on df.COUNTRY = m.country
where speed_df1 > avg_velocidad_descarga and df.COUNTRY = 'Argentina'
""").df()

alt.Chart(query).mark_bar().encode(
    y=alt.Y('estado:N', title= None, sort='-x'),
    x=alt.X('speed_df1:Q', title='Velocidades de descarga'),
    color=alt.Color('estado:N', title = '',
       scale=alt.Scale(range=palette), legend=None),
    tooltip=[
        alt.Tooltip('country:N', title='País'),
        alt.Tooltip('speed_df1', title='Velocidad de descarga (Mbps)', format='.0f'),
        alt.Tooltip('avg_velocidad_descarga', title='Prom. Velocidad Descarga', format=',.0f')
    ]
).properties(
    title='Provincias argentinas con velocidades promedio por encima del promedio del país'
)
Out[ ]:

Entre las provincias argentinas que se destacan por tener una velocidad de descarga por encima del promedio (59 Mpbs) se encuentra la Ciudad Autónoma de Buenos Aires con 151 Mbps, seguida de la Prov. de Buenos Aires (103Mbps), Tucumán (81 Mbps), Santa Fe (72 Mbps) y Córdoba (69 Mbps).

Y, ¿cuáles son las provincias con una velocidad menor al promedio del país?

In [ ]:
query = duckdb.sql("""
with m as (
select COUNTRY as country, avg(speed_df1) AS avg_velocidad_descarga
from df
group by COUNTRY)

select df.COUNTRY as country, NAME_1 as estado, NAME_2 as ciudad, speed_df1, avg_velocidad_descarga
from df inner join m on df.COUNTRY = m.country
where speed_df1 < avg_velocidad_descarga and df.COUNTRY = 'Argentina'
""").df()

alt.Chart(query).mark_bar().encode(
    y=alt.Y('estado:N', title= None, sort='-x'),
    x=alt.X('speed_df1:Q', title='Velocidades de descarga'),
    color=alt.Color('estado:N', title = '',
       scale=alt.Scale(range=palette), legend=None),
    tooltip=[
        alt.Tooltip('country:N', title='País'),
        alt.Tooltip('speed_df1', title='Velocidad de descarga (Mbps)', format='.0f'),
        alt.Tooltip('avg_velocidad_descarga', title='Prom. Velocidad Descarga', format=',.0f')
        ]
).properties(
    title='Provincias argentinas con velocidades promedio por debajo del promedio del país'
)
Out[ ]:

Entre las provincias argentinas que se destacan por tener una velocidad de descarga por debajo del promedio (59 Mpbs) se encuentra Tierra del Fuego con 18 Mbps, seguida de La Pampa (23 Mbps), San Luis (25 Mbps) y Santa Cruz (32 Mbps).

4. ¿Existe una relación entre las velocidades de carga y descarga?¶

In [ ]:
#Gráfico de dispersión para observar la relación entre las variables de velocidad de subida y descarga
alt.Chart(df).mark_circle().encode(
    alt.X('speed_df1', title='Velocidad de descarga (Mbps)').scale(zero=False),
    alt.Y('speed_uf1',title='Velocidad de carga (Mbps)').scale(zero=False, padding=1),
    color=alt.Color('COUNTRY:N', title = '', scale=alt.Scale(range=palette)),
    tooltip=[
        alt.Tooltip('COUNTRY', title='País'),
        alt.Tooltip('speed_df1', title='Velocidad de descarga (Mbps)', format='.0f'),
        alt.Tooltip('speed_uf1', title='Velocidad de carga (Mbps)', format='.0f')
    ]
).properties(
    title=alt.TitleParams(
        text='Relación entre velocidad de carga y descarga por país',
        anchor='middle',
        fontSize=16
    ),
    width=500,
    height=300
)
Out[ ]:

Se observa una relación general positiva, donde mayores velocidades de descarga se asocian con mayores velocidades de carga. Sin embargo, esta relación no es perfectamente lineal, ya que existen varios casos donde países con velocidades de descarga similares muestran diferencias significativas en sus velocidades de carga.

5. ¿Existe una relación entre la velocidad de internet y la cantidad de población?¶

In [ ]:
#Aplicamos logaritmo a la variable población a efectos de suavizar las diferencias y facilitar la interpretación
df['total_population_ctry'] = df.groupby('COUNTRY')['poblacion'].transform('sum')
df['pob_per']=round((df['poblacion']/df['total_population_ctry'])*100, ndigits=2)
df.head()
df['log_pob']=round(np.log(df['poblacion']), ndigits=2)
df.head()
Out[ ]:
COUNTRY NAME_1 NAME_2 speed_df1 speed_uf1 poblacion tics_internet agua_mejorada_red electricidad total_population_ctry pob_per log_pob
0 Argentina Buenos Aires NaN 103.450934 54.207011 15634050.0 NaN 0.756510 0.997917 40134498.0 38.95 16.56
1 Argentina Catamarca NaN 58.539385 31.985785 367556.0 NaN 0.935111 0.976998 40134498.0 0.92 12.81
2 Argentina Chaco NaN 52.419413 27.133152 1055337.0 NaN 0.763009 0.939295 40134498.0 2.63 13.87
3 Argentina Chubut NaN 51.833834 44.693544 509194.0 NaN 0.963976 0.990512 40134498.0 1.27 13.14
4 Argentina Ciudad de Buenos Aires NaN 150.602219 59.033449 2892544.0 NaN 0.997258 0.999503 40134498.0 7.21 14.88
In [ ]:
#Realizamos un gráfico de dispersión para observar la relación entre velocidad descarga y la población del país
alt.Chart(df).mark_circle().encode(
    alt.X('log_pob', title='Población (log)').scale(zero=False),
    alt.Y('speed_df1', title='Velocidad de descarga (Mbps)').scale(zero=True, padding=1),
    color=alt.Color('COUNTRY:N', title = '', scale=alt.Scale(range=palette)),
    tooltip=[
        alt.Tooltip('COUNTRY', title='País'),
        alt.Tooltip('speed_df1', title='Velocidad de descarga (Mbps)', format='.0f'),
        alt.Tooltip('total_population_ctry', title='Población', format=',.0f')
    ]
).properties(
    title=alt.TitleParams(
        text='Relación entre velocidad de decarga y población por país',
        anchor='middle',
        fontSize=16
    ),
    width=500,
    height=300
)
Out[ ]:

El gráfico muestra una relación positiva entre la velocidad de descarga y el tamaño de la población en los gobiernos subnacionales (proxy de ruralidad), aunque no es una correlación perfectamente lineal. Los subnacionales con poblaciones más grandes tienden a tener velocidades de descarga más altas, pero hay excepciones, lo que indica que otros factores más allá del tamaño de la población influyen en el rendimiento de Internet. Los puntos de datos exhiben una dispersión considerable, lo que sugiere una variabilidad significativa en las velocidades de descarga incluso entre subnacionales con niveles de población similares. Esta heterogeneidad implica que factores como las inversiones en infraestructura, la topografía o las políticas pueden desempeñar un papel importante en la configuración del acceso y la calidad de Internet en la región.

6. ¿Existe una relación entre la velocidad de internet y el acceso a internet?¶

In [ ]:
#Realizamos un gráfico de dispersión para observar la relación entre velocidad descarga y la penetración de internet en los hogares
alt.Chart(df).mark_circle().encode(
    alt.X('tics_internet', title='% Hogares con acceso a internet').scale(zero=False),
    alt.Y('speed_df1', title='Velocidad de descarga (Mbps)').scale(zero=False, padding=1),
    color=alt.Color('COUNTRY:N', title = '', scale=alt.Scale(range=palette)),
    #size='poblacion',
    tooltip=[
        alt.Tooltip('COUNTRY', title='País'),
        alt.Tooltip('speed_df1', title='Velocidad de descarga (Mbps)', format='.0f'),
        alt.Tooltip('tics_internet', title='% Hogares con acceso', format='.0%')
        ]
).properties(
    title=alt.TitleParams(
        text='Relación entre velocidad de decarga y % de hogares con acceso a internet',
        anchor='middle',
        fontSize=16
    ),
    width=500,
    height=360
)
Out[ ]:

Se observa una relación positiva, donde los subnacionales con mayor porcentaje de hogares conectados tienden a tener velocidades de descarga más altas. Sin embargo, también hay bastante variabilidad. La dispersión de los puntos también indican una gran heterogeneidad dentro de algunos países, con amplias brechas en la velocidad de acceso a internet entre diferentes regiones del país. Se visualizan casos atípicos correspondientes a Brasil con un % de acceso menor al 10% y con velocidades superiores a 300Mbps, para los cuales habría que corroborar si se corresponden con errores o no.

7. ¿Existe una relación entre la velocidad de internet y el acceso a la electricidad?¶

In [ ]:
#Realizamos un gráfico de dispersión para observar la relación entre velocidad descarga y el acceso a electricidad
alt.Chart(df).mark_circle().encode(
    alt.X('electricidad', title='% Hogares con acceso a electricidad').scale(zero=False),
    alt.Y('speed_df1', title='Velocidad de descarga (Mbps)').scale(zero=True, padding=1),
    color=alt.Color('COUNTRY:N', title = '', scale=alt.Scale(range=palette)),
        tooltip=[
        alt.Tooltip('COUNTRY', title='País'),
        alt.Tooltip('speed_df1', title='Velocidad de descarga (Mbps)', format='.0f'),
        alt.Tooltip('electricidad', title='% Hogares con acceso', format='.0%')
        ]
).properties(
    title=alt.TitleParams(
        text='Relación entre velocidad de decarga y % de hogares con acceso a electricidad',
        anchor='middle',
        fontSize=16
    ),
    width=500,
    height=360
)
Out[ ]:

La relación no es completamente lineal y positiva. Hay una tendencia general de aumento en la velocidad de descarga a medida que aumenta el acceso a electricidad, pero también se observan notables excepciones donde subnacionales con alto acceso eléctrico tienen velocidades relativamente bajas. Esto sugiere que otros factores, más allá del simple acceso a la red eléctrica, también influyen en la velocidad final de descarga, como la calidad de la infraestructura de telecomunicaciones u otros aspectos económicos y tecnológicos.

8. ¿Existe una relación entre la velocidad de internet y el acceso a agua potable a través de la red?¶

In [ ]:
#Realizamos un gráfico de dispersión para observar la relación entre velocidad descarga y el abastecimiento de agua a través de red
alt.Chart(df).mark_circle().encode(
    alt.X('agua_mejorada_red', title='% Hogares con agua por red').scale(zero=False),
    alt.Y('speed_df1', title='Velocidad de descarga (Mbps)').scale(zero=True, padding=1),
    color=alt.Color('COUNTRY:N', title = '', scale=alt.Scale(range=palette)),
        tooltip=[
        alt.Tooltip('COUNTRY', title='País'),
        alt.Tooltip('speed_df1', title='Velocidad de descarga (Mbps)', format='.0f'),
        alt.Tooltip('electricidad', title='% Hogares con agua por red', format='.0%')
        ]
).properties(
    title=alt.TitleParams(
        text='Relación entre velocidad de decarga y % Hogares con agua por red',
        anchor='middle',
        fontSize=16
    ),
    width=500,
    height=360
)
Out[ ]:

La relación entre la velocidad de descarga y el porcentaje de hogares con acceso a agua por red también muestra una tendencia general positiva, pero con considerables excepciones. Algunos subnacionales con alto acceso a agua tienen velocidades de descarga relativamente bajas, mientras que otros con menor acceso tienen velocidades más altas.